gdkglcontext-win32.c: Fix Resizing and moving
authorChun-wei Fan <fanchunwei@src.gnome.org>
Mon, 1 Apr 2019 06:47:36 +0000 (14:47 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Mon, 1 Apr 2019 06:51:29 +0000 (14:51 +0800)
We preiously did not apply the resizes and moves as they were previously
only done in the Cairo drawing context on Win32.  Fix this by applying
this too in the GL drawing context.

gdk/win32/gdkglcontext-win32.c

index 4845f4ba16d1d70f3126e3ac8307f4b3e19f4407..f97dc67fc3dc11eb797cc96a04c08c3de97e7216 100644 (file)
@@ -166,6 +166,27 @@ gdk_win32_gl_context_begin_frame (GdkDrawContext *draw_context,
 {
   GdkGLContext *context = GDK_GL_CONTEXT (draw_context);
   GdkSurface *surface;
+  GdkSurfaceImplWin32 *impl;
+  RECT queued_window_rect;
+
+  surface = gdk_gl_context_get_surface (context);
+  impl = GDK_SURFACE_IMPL_WIN32 (surface->impl);
+
+  gdk_win32_surface_get_queued_window_rect (surface,
+                                            gdk_surface_get_scale_factor (surface),
+                                            &queued_window_rect);
+
+  /* Apply queued resizes GL windows before painting them
+   *  (we paint on the window DC directly, it must have the right size).
+   * Due to some poorly-understood issue delayed
+   * resizing of double-buffered windows can produce weird
+   * artefacts, so these are also resized before we paint.
+   */
+  if (impl->drag_move_resize_context.native_move_resize_pending)
+    {
+      impl->drag_move_resize_context.native_move_resize_pending = FALSE;
+      gdk_win32_surface_apply_queued_move_resize (surface, queued_window_rect);
+    }
 
   GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_parent_class)->begin_frame (draw_context, update_area);
   if (gdk_gl_context_get_shared_context (context))
@@ -176,7 +197,6 @@ gdk_win32_gl_context_begin_frame (GdkDrawContext *draw_context,
 
   /* If nothing else is known, repaint everything so that the back
      buffer is fully up-to-date for the swapbuffer */
-  surface = gdk_gl_context_get_surface (context);
   cairo_region_union_rectangle (update_area, &(GdkRectangle) {
                                                  0, 0,
                                                  gdk_surface_get_width (surface),